package com.yxx.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.InputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.Objects;

/**
 * 文件md5工具类
 * @author yuxiangxun
 * @date 2025/1/18
 * @apiNote
 */
@Slf4j
public class FileUtils {

    /**
     * 获取文件md5值
     * @param inputStream 文件输入流
     * @return 文件md5值
     */
    public static String getMd5(InputStream inputStream){
        String md5 = null;
        try{
            md5 = DigestUtils.md5DigestAsHex(inputStream);
        }catch (Exception e){
            log.error("get md5 error, {}", e.getMessage());
        }
        return md5;
    }

    /**
     * 获取文件名的后缀
     * @param file 表单文件
     * @return 后缀名
     */
    public static String getExtension(MultipartFile file){
        // 获取文件的内容类型 MIME 类型 image/jpeg （这是文件无扩展名的情况）
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if(StringUtils.isEmpty(extension)){
            // 推断获取真正的后缀
            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
        }
        return extension;
    }

    /**
     * 创建目录
     * @param file 文件
     * @return 是否创建成功
     */
    public static boolean mkdir(File file){
        if(file == null){
            return false;
        }
        // 文件不存在，就创建目录； 如果文件存在，证明之前已经创建了目录，无需再创建目录
        if(file.exists()){
            return false;
        }
        return file.mkdirs();
    }

    /**
     * 删除文件
     * @param src 文件或目录    最终目的是删除整个文件及其子文件和子目录
     */
    public static void deleteFile(File src){
        for(File file : src.listFiles()){
            if(file.isFile()){
                // 是文件就删除 （递归结束出口）
                file.delete();
            }else{
                // 递归删除文件
                deleteFile(file);
            }
        }
        src.delete();
    }

}
